先前我們講完了Transformer
的NLP模型架構了,而該模型的出現也替接下來的NLP
帶了重大的影響,其後的包含GPT
, BERT
, XLM
等Pretrained model都是受到 Transformer
的啟發所演變過來的。在接下來我也會針對每一個模型去做論文的探討與分享。而今天我們要探討的是 BERT(Bidirectional Encoder Representations from
Transformers)
,其來自google 2018年發表的論文如下:
BERT
在這邊先情提要一下,他是一種利用Pretrain
的方式來將文字、句子的資料訓練出來(representation),也就是訓練出Language Model
,然而再根據task需求訂定不同的top-layer
來做到任務的訓練與預測。所以簡單來說,BERT
的主體只是將句子與上下文的資訊訓練出來,然後在最後output的部分透過不同layer的訂定來將這樣的representation
視為input,最後來產出對應的task需求。
那何謂Language Model
?簡單來說透過unsupervised-learning
在一些文字的情況下,來預測出下一個文字為何的模型。所以對於文字不需要做標記
的動作,通通將文字與句子來做訓練,讓模型學習到上下文語法結構
,也就是對於語言有了一定程度的理解。我們就可以利用這個資訊來做其他下游任務的應用。所以也牽扯到Transfer-learning
,進而來降低建構對於任務的模型成本,不用每一個任務就建構一個模型,先利用Language Model
取得input,在微調layer就可以產生對應的任務模型。所以可說是好處多多啊。
Background
作者在這邊的有先特別提到,過往在 NLP
領域當中若要利用 Pretrain
的方式來產生 Language Model
的做法,可以分為兩種,如下:
Feature-Based
這個方法最典型的是ELMO
模型,運作原理簡單來說就是把原本pre-trained的Language Model
的output作為 額外的特徵
,再加以concat到原先任務訓練model的input來做訓練,所以該方法會牽扯到兩種模型。
這邊通常會包含了兩個步驟:
(1)先利用corpus A來訓練出Language Model
,該模型參數已經固定。
(2)然後利用corpus B來訓練原先任務的模型(ex.句子分類),只是會先將corpusB透過Language Model
得到對應的representation
,來作為任務模型的額外特徵訓練。
Fine-tune
該方法只會有一種模型,差別在於一樣會訓練出Language Model
,但會在最後的output加入或修正特定的layer和參數,藉此來符合任務模型的需求。以『句子分類』來說,就會在最後的layer加入softmax
來做訓練。而這樣的訓練正因為加入新的layer,所以在訓練過程中,模型為了fit任務需求,模型的參數是由訓練過程中做變動的。
這裡最代表的模型是GPT
,他是採用Transformer-Decoder
來做訓練,透過大量的corpus來訓練出Language Model
,最後加入一層linear來作為NLP任務的輸出,所以在這樣的前提下,一樣有包含了兩個步驟:
(1)透過corpusA訓練Language Model
(2)然後直接在Language Model
加入layer來轉成任務模型(fine-tune
),再用corpusB來做訓練,此時模型參數不固定。
而BERT
模型就是採用了Fine-tune
的方式來做到多NLP
任務。在論文中我們可以看到如下架構:
這樣的架構就是在BERT
的Transfer-learning
,所以學會使用 BERT 就能用同個架構訓練多種 NLP 任務,進而降低自行設計與建構任務模型的成本。
雖然對於工程師或科學家而言是降低建構與設計的成本沒錯,但是有一好沒兩好,在BERT
的設計當中,其中蘊含著龐大的參數量,這會造成訓練的過程十分耗資源與時間,依據作者在論文中有用到兩種BERT的架構
(1)BERT-Base:
L = 12, H = 768, A = 12, Total parameters = 110M
(2)BERT-Large:
L = 24, H = 1024, A = 16, Total parameters = 340M
L代表Transformer的層數,H代表Transformer的hidden_size
,A代表self-attention
的heads數量。這樣的計算量作者都用到TPU去計算,可見得所耗的資源十分可觀。
BERT Model Architecture
在BERT模型是採用Transformer-Encoder
(上圖左邊元件)的Language Model
架構,採用Encoder
架構有什麼優點,如果讀者們還記得在Encoder
當中,Transformer
應用了self-attention
來取得每次文字對於整體上下文的重要性,進而獲得對應的representation。所以每次計算都會採用到上下文的文字資訊。這相較於GPT
採用Transformer-Decoder
只能依賴先前的文字(Mask的原因
)來做計算有明顯的不同。
GPT: 因為採用到Transformer-Decoder Mask的原理,所以是屬於『單向Language Model』。
BERT: 則是透過Transformer-Encoder自身的self-attention,所以屬於『雙向Language Model』。
詳細的流程差異可參考作者在論文提供的架構:
Pretrain
在Pretrain
階段,作者在這篇論文應用了兩種方式,分別是MLM(Masked Language Model)
和NSP(Next Setence Prediction)
,利用這兩種方式來訓練出BERT Language Mode:
1. MLM(Masked Language Model)
白話一點我們可以認定成就是克漏字填空
,透過隨機將句子中的token文字來作為mask來訓練預測,這樣做的用意就是讓模型可以善加應用到上下文的文字資訊。
作者在該方法的做法是隨機挑選corpus的15%來做要預測的token,所以會將這些token轉換成[MASK]
這樣的token來讓模型做預測,其中對應的label就是原先的token。但這樣其實存在這一個問題,就是當整合到Finetune
時,輸入的文字就不會被MASK
,就會造成Pretrain
和Finetune
會有不一致,作者利用如下的方式來解決:
- 在被15%挑選要MASK的token當中,再挑80%的token來用
[MASK]
代替。I am working from home. -> I am working from [MASK].
- 在被15%挑選要MASK的token當中,再挑10%的token來用
任意token
代替,不管語句是否合理。I am working from home. -> I am working from paper.
- 在被15%挑選要MASK的token當中,再挑10%的token不做任何變化。
I am working from home. -> I am working from home.
2. NSP(Next Setence Prediction)
換句話說就是來預測第二個句子是否是第一個句子的下一句。所以從這邊可隱含得到再訓練的輸入必須是一個pair
的結構。舉例如下:
Input: [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input: [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]
Label = NotNext
[CLS]
代表是句子的一開頭,[SEP]
代筆是句子與句子之間的斷點處。
Model Input
在BERT
的訓練當中,必須要經過特殊的input embedding建構才能做訓練。上圖是作者在論文中提出的作法,求出三個embedding最後concat做訓練,分別如下:
(1) Token Embedding:用來表示每一個token的embedding
(2) Segment Embedding:用來表示是在第一句或是第二句的embedding(第一句為0,第二句為1)
(3) Position Embedding:用來表示token先後順序的embedding
然而為了使GPU能夠平行運算,對於每個batch不足max_sequence_length
的位置都用[PAD]
來補齊,其對應的值也皆為0
會需要這樣設計是因為希望可以同時滿足兩種Pretrain
的任務,用來表示單句或是句子pair,也透過一些特殊的token來表示token在句子之間的關係。
Bert Finetune
BERT 是一個Language Model,他能產出含有context的representation,能讓同一個token在不同位置有不同的representation,同時對下游的 Finetune NLP 任務很有幫助。
我們都知道BERT
在Pretrain
階段所做的任務是什麼了,作者在這篇論文後面也有附錄關於BERT
的Finetune
之四種任務,這邊也帶大家來理解每個任務在做的用途,大部分的input都差不多,主要差別在於最後top-layer的output結果。
(a) Sentence Pair Classification(成對句子分類任務)
該任務用來分類兩句子之間的關係,可能是是否對調、是否合乎假設等。
(b) Single Sentence Classification(單一句子分類任務)
該任務最單純,就是辨識句子是何種分類,ex.句子是屬於正向或是負向評論等。
(c) Question Answer Task(問答任務)
該任務會學習文章,並且根據問題來搜尋文章內合適的答案,並將答案所處的位置索引回傳出來。
(d) Single Sentence Tagging Task(單一句子標記任務)
該任務大家最熟悉的應該是NER
,也就是Named Entity Recognization
,輸入一個句子,然後輸出該句子內有哪些實體辨別。
Conclusion
透過這篇我們不然發現原先一開始的Transformer
是如何演化成像是BERT
,GPT
等模型來解決NLP任務,當然並不是BERT
是最好,畢竟這是2018年的論文了,轉眼兩年過去其實有越來越多針對BERT
所優化的模型也都出現了,像是ALBert
,DistillBert
,LongFormer
等,每個模型都一定有他的原因才會造就他的出現,接續也會帶著大家來持續更新現在NLP的Pretrained Model。